#ifndef STM32F1_GPIO_H_
#define STM32F1_GPIO_H_

#include "iodef.h"

typedef struct
{
        __IO uint32_t EVCR;
        __IO uint32_t MAPR;
        __IO uint32_t EXTICR[4];
}afio_reg_t;

#define AFIO_EVCR_PIN_MASK      _VALUE(0, 0xF)
#define AFIO_EVCR_PIN(n)        _VALUE(0, (n))
#define AFIO_EVCR_PORT_MASK     _VALUE(4, 0x7)
#define AFIO_EVCR_PORT_PA       _VALUE(4, 0)
#define AFIO_EVCR_PORT_PB       _VALUE(4, 1)
#define AFIO_EVCR_PORT_PC       _VALUE(4, 2)
#define AFIO_EVCR_PORT_PD       _VALUE(4, 3)
#define AFIO_EVCR_PORT_PE       _VALUE(4, 4)
#define AFIO_EVCR_EVOE          _BIT(7)


#define AFIO_MAPR_SWJ_CFG_MASK          _VALUE(24, 0x7)
#define AFIO_MAPR_SWJ_CFG_RESET         _VALUE(24, 0x0)
#define AFIO_MAPR_SWJ_CFG_NOJNTRST      _VALUE(24, 0x1)
#define AFIO_MAPR_SWJ_CFG_JTAGDISABLE   _VALUE(24, 0x2)
#define AFIO_MAPR_SWJ_CFG_DISABLE       _VALUE(24, 0x4)

#define AFIO    ((afio_reg_t *)AFIO_BASE)

typedef struct {
        __IO uint32_t CR[2];
        __IO uint32_t IDR;
        __IO uint32_t ODR;
        __IO uint32_t BSRR;
        __IO uint32_t BRR;
        __IO uint32_t LCKR;
        __IO uint32_t reserv[249];
}gpio_reg_t;



#define GPIO_MASK(n)                    _VALUE(((n) << 2), 0xF)
#define GPIO_CONFIG(n, v)               _VALUE(((n) << 2), (v))

#define GPIO_MODE_OUT_10M(n)            _VALUE(((n) << 2), 0x1)
#define GPIO_MODE_OUT_2M(n)             _VALUE(((n) << 2), 0x2)
#define GPIO_MODE_OUT_50M(n)            _VALUE(((n) << 2), 0x3)
#define GPIO_MODE_IN(n)                 _VALUE(((n) << 2), 0x0)

#define GPIO_AF_OUT_PP(n)               _VALUE(((n) << 2), 0x8)
#define GPIO_AF_OUT_OD(n)               _VALUE(((n) << 2), 0xC)
#define GPIO_GP_OUT_PP(n)               _VALUE(((n) << 2), 0x0)
#define GPIO_GP_OUT_OD(n)               _VALUE(((n) << 2), 0x4)

#define GPIO_IN_ANALOG(n)               _VALUE(((n) << 2), 0)
#define GPIO_IN_FLOAT(n)                _VALUE(((n) << 2), 0x4)
#define GPIO_IN_PP(n)                   _VALUE(((n) << 2), 0x8)

#define GPIO                ((gpio_reg_t *) GPIOA_BASE)
#define GPIOA               ((gpio_reg_t *) GPIOA_BASE)
#define GPIOB               ((gpio_reg_t *) GPIOB_BASE)
#define GPIOC               ((gpio_reg_t *) GPIOC_BASE)
#define GPIOD               ((gpio_reg_t *) GPIOD_BASE)
#define GPIOE               ((gpio_reg_t *) GPIOE_BASE)
#define GPIOF               ((gpio_reg_t *) GPIOF_BASE)
#define GPIOG               ((gpio_reg_t *) GPIOG_BASE)

#define GPIO_PORT_MAX   7
#define GPIO_PORT_PIN   16
#define GPIO_MAX        (GPIO_PORT_PIN * GPIO_PORT_MAX)

#define GPIO_PORT(n)    (((n) >> 4) & 7)
#define GPIO_PIN(n)     ((n) & 15)

#define GPA 0
#define GPB 1
#define GPC 2
#define GPD 3
#define GPE 4
#define GPF 5
#define GPG 6

#endif /* STM32F1_GPIO_H_ */
